package com.offics.loan.domain.service;

import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 短信验证码领域服务
 */
@Service
@RequiredArgsConstructor
public class SmsCodeDomainService {

    private final RedisTemplate<String, Object> redisTemplate;

    // 验证码过期时间（秒）
    private static final int EXPIRE_TIME = 600;

    // Redis key前缀
    private static final String SMS_CODE_PREFIX = "sms:code:";

    /**
     * 生成验证码
     *
     * @param phone 手机号
     * @param type 验证码类型（1-注册，2-登录，3-重置密码）
     * @return 验证码
     */
    public String generateCode(String phone, Integer type) {
        // 生成6位随机数字验证码
        String code = generateRandomCode(6);

        // 构建Redis key
        String key = buildKey(phone, type);

        // 存储验证码到Redis，设置过期时间
        redisTemplate.opsForValue().set(key, code, EXPIRE_TIME, TimeUnit.SECONDS);

        // 实际项目中，这里会调用短信发送服务发送验证码
        // 为了演示，这里只打印验证码
        System.out.println("向手机号 " + phone + " 发送验证码: " + code);

        return code;
    }

    /**
     * 验证验证码
     *
     * @param phone 手机号
     * @param code 验证码
     * @param type 验证码类型（1-注册，2-登录，3-重置密码）
     * @return 是否验证成功
     */
    public boolean verifyCode(String phone, String code, Integer type) {
        // 构建Redis key
        String key = buildKey(phone, type);

        // 从Redis获取验证码
        Object savedCode = redisTemplate.opsForValue().get(key);

        // 验证码不存在或已过期
        if (savedCode == null) {
            return false;
        }

        // 验证码不匹配
        if (!code.equals(savedCode.toString())) {
            return false;
        }

        // 验证成功后，删除验证码
        redisTemplate.delete(key);

        return true;
    }

    /**
     * 构建Redis key
     *
     * @param phone 手机号
     * @param type 验证码类型
     * @return Redis key
     */
    private String buildKey(String phone, Integer type) {
        return SMS_CODE_PREFIX + type + ":" + phone;
    }

    /**
     * 生成随机数字验证码
     *
     * @param length 验证码长度
     * @return 随机数字验证码
     */
    private String generateRandomCode(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }

    /**
     * 获取验证码过期时间（秒）
     *
     * @return 过期时间
     */
    public int getExpireTime() {
        return EXPIRE_TIME;
    }
}
